package Logica;
import java.util.Iterator;
import java.util.LinkedList;

import Dinero.Dinero;
import Humanos.Humano;
import TDADiccionario.*;
import Zombies.Zombie;

public class Tablero{	
	//ATRIBUTOS DE INSTANCIA
	protected Dictionary<Integer,Humano> humanos;
	protected Dictionary<Integer,Zombie> zombies;
	protected LinkedList<Dinero> dinero;
	protected Juego juego;
	
	//CONSTRUCTOR
	public Tablero(Juego j){
		humanos=new HashTableDictionary<Integer,Humano>();
		zombies=new HashTableDictionary<Integer,Zombie>();
		dinero=new LinkedList<Dinero>();
		juego=j;
	}
	
	//COMANDOS
	public void colocarZombie(Zombie z){
		try {
			zombies.insert(z.getFila(),z);
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();}
	}
	public void retirarZombie(Zombie z){
		try {
			zombies.remove(new Entrada<Integer,Zombie>(z.getFila(),z));
		} catch (InvalidEntryException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();}
	}
	public void colocarHumano(Humano h){
		try {
			humanos.insert(h.getFila(), h);
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();}	
	}
	public void retirarHumano(Humano h){
		try {
			humanos.remove(new Entrada<Integer,Humano>(h.getFila(),h));
		} catch (InvalidEntryException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();}
	}
	public void colocarDinero(Dinero d){
		dinero.add(d);
	}
	public void retirarDinero(Dinero d){
		dinero.remove(d);
	}
	
	//CONSULTAS
	public Zombie primerZombieFila(int fila){//DEVUELV EL PRIMER ZOMBIE EN UNA FILA DETERMINADA
		Zombie primero=null;
		Iterator<Entry<Integer,Zombie>> it;
		try {
			it = zombies.findAll(fila).iterator();
			Zombie z;
			if(it.hasNext()){
				primero=it.next().getValue();
				while(it.hasNext()){
					z=it.next().getValue();
					if(z.getColumna()<primero.getColumna())
						primero=z;}}
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();}
		return primero;	
	}
	public boolean hayHumanoFila(int fila,int col){//INDICA SI HAY UN HUMANO EN UNA POSICION DETERMINADA
		boolean hay=false;
		Iterator<Entry<Integer, Humano>> it;
		try {
			it = humanos.findAll(fila).iterator();
			Entry<Integer,Humano> e;
			while((it.hasNext())&&(!hay)){
				e=it.next();
				if(e.getValue().getColumna()==col)
					hay=true;}
		} catch (InvalidKeyException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();}
		return hay;
	}
	public boolean hayDinero(int fila,int col){//INDICA SI HAY UN DINERO EN UNA POSICION DETERMINADA
		boolean hay=false;Iterator<Dinero> it=dinero.iterator();Dinero d;
		while((it.hasNext())&&(!hay)){
			d=it.next();
			if((d.getFila()==fila)&&(d.getColumna()==col))
				hay=true;}
		return hay;
	}
	public Iterable<Humano> getHumanos(){//RETORNA UN ITERADOR CON LOS HUMANOS DEL TABLERO
		LinkedList<Humano> aux=new LinkedList<Humano>();
		for(Entry<Integer,Humano> e:humanos.entries())
			aux.add(e.getValue());
		return aux;
	}		
	public Humano posicion(int fila,int col){//DEVUELVE EL HUMANO QUE SE ENCUENTRA EN LA POSICION INDICADA
		Humano h=null;
		try {
			Iterable<Entry<Integer,Humano>> itera=humanos.findAll(fila);
			if(itera!=null){//SIGNIFICA QUE NO HAY HUMANOS EN ESA FILA
				Iterator <Entry<Integer,Humano>> it=itera.iterator();
				boolean hay=false;Entry<Integer,Humano> e;
				while((it.hasNext())&&(!hay)){
					e=it.next();
					if(e.getValue().getColumna()==col){
						hay=true;
						h=e.getValue();}}}
			} catch (InvalidKeyException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();}
		return h;
	}
	public Iterable<Zombie> zombiesAlrededor(int fila,int col){//DEVUELVE LOS ZOMBIES QUE SE SE ENCUENTRAN EN LAS POSICIONES
		LinkedList<Zombie> l=new LinkedList<Zombie>();
		Iterable<Entry<Integer,Zombie>> itera;Iterator<Entry<Integer,Zombie>> it;
		if(fila-1>=1){//SE FIJA EN LA FILA ARRIBA DE LA INDICADA SI ES POSIBLE
			try {
				itera=zombies.findAll(fila-1);
				if(itera!=null){
					it=itera.iterator();
					boolean seguir=true;Entry<Integer,Zombie> e;
					while((it.hasNext())&&(seguir)){
						e=it.next();
						if((e.getValue().getColumna()==col)||(e.getValue().getColumna()==col-1))
							l.addLast(e.getValue());
						else if(e.getValue().getColumna()==col+1){
								l.addLast(e.getValue());seguir=false;}}}
			} catch (InvalidKeyException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();}}
		
		try {//SE FIJA EN LA FILA INDICADA
			itera=zombies.findAll(fila);
			if(itera!=null){
				it=itera.iterator();
				boolean seguir=true;Entry<Integer,Zombie> e;
				while((it.hasNext())&&(seguir)){
					e=it.next();
					if((e.getValue().getColumna()==col)||(e.getValue().getColumna()==col-1))
						l.addLast(e.getValue());
					else if(e.getValue().getColumna()==col+1){
							l.addLast(e.getValue());seguir=false;}}}
		} catch (InvalidKeyException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();}
		
		if(fila+1<=5){//SE FIJA EN LA FILA ABAJO DE LA INDICADA SI ES POSIBLE
			try {
				itera=zombies.findAll(fila+1);
				if(itera!=null){
					it=itera.iterator();
					boolean seguir=true;Entry<Integer,Zombie> e;
					while((it.hasNext())&&(seguir)){
						e=it.next();
						if((e.getValue().getColumna()==col)||(e.getValue().getColumna()==col-1))
							l.addLast(e.getValue());
						else if(e.getValue().getColumna()==col+1){
								l.addLast(e.getValue());seguir=false;}}}
			} catch (InvalidKeyException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();}}		
		return l;
	}
	
	
}
